﻿/*
 * PacketFile.h
 *
 *  Created on: 2016年10月9日
 *      Author: zhengboyuan
 */

#ifndef PACKETFILE_H_
#define PACKETFILE_H_

#include "BasicType.h"
#include <vector>
#include <fstream>


namespace av
{

/// 包标签
enum PacketTag
{
	kFormat = 1,	/// 媒体格式
	kPacket,		/// 媒体包数据
	kIndex,			/// 媒体索引
	kEnd			/// 结束包
};

#pragma pack(1)

struct PacketHeader
{
	int 	tag;		/// 包标签 @ PacketTag
	int64_t 	clock;

	int 	type;		/// 音视频类型
    int     flags;		/// 标识
    int64_t ts;			/// 时间戳
    int32_t duration;	/// 时长

    int     size;		/// 数据长度

    /// 载体数据
};


struct PacketIndex
{
	int type;			/// 音视频类型
	int64_t	timestamp;	/// 时间戳
	int keyframe;		/// 是否为关键帧
	int64_t	offset;		/// 文件偏移
};


struct PacketEnd
{
	int magic;
	int indexSize;		//// 索引长度
};


#pragma pack()



class PacketIndexFile
{
public:
	PacketIndexFile();
	~PacketIndexFile();

	bool open(const char* filename);
	void close();
	bool isOpen();

	bool reload();

	int64_t getDuration();

	/**
	 * 定位到指定时间
	 * @param seconds
	 * @param entry
	 * @return
	 */
	bool locate(int64_t offset, PacketIndex& index);

	int64_t getStartTime();

protected:
	typedef std::vector< PacketIndex >	PacketIndexArray;

	PacketIndexArray	m_indexArray;

	std::string m_filename;
	std::ifstream	m_ifs;

};



class PacketFile
{
public:
	PacketFile();
	virtual ~PacketFile();
};





} /* namespace av */

#endif /* PACKETFILE_H_ */
